package com.oracle.Aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * @Component注解是一个通用注解，可以添加任何类上，spring会负责该类对象的创建和生命周期的管理
 * @Aspect 注释用来注释切面类
 */
@Component
@Aspect
public class MyAspectAnnation {
    /**
     * @Before 注解注释的方法是一个前置通知方法。
     *   value属性表示通知的规则.
     *     取值语法: execution(返回值类型 包名.类名.方法名(..))
    返回值类型：可以赋值 * ,*表示通配符，可以匹配所有的返回值类型。
    表示的是被增强方法的返回值类型。
    包名: 可以赋值 *,，可以匹配所有的包名。
    表示的是被增强方法的所在包的包名。
    类名：表示的是被增强方法所在类的类名。
    可以赋值*,*可以匹配所有的类名
    方法名：表示的是被增强方法的方法名。
    可以赋值*，*表示所有的方法名。
    (..):固定写法，表示支持所有无参和有参的方法。
     */
       @Before(value = "execution(* com.oracle.DAO.UserDAO.*(..))")
       public void before(){
           System.out.println("前置通知执行了...");
       }

    /**
     * @AfterReturning注解注释的方法是一个后置返回通知
     */
    @AfterReturning(value = "execution(* com.oracle.DAO.UserDAO.*(..))")
       public void afterReturning(){

        System.out.println("后置返回通知执行了...");
       }

    /**
     * @AfterThrowing注解注释的方法是一个异常通知
     */
    @AfterThrowing(value = "execution(* com.oracle.DAO.UserDAO.*(..))")
    public void afterThrowing(){
        System.out.println("异常通知执行了...");

       }
       @After(value = "execution(* com.oracle.DAO.UserDAO.*(..))")
       public void after(){
           System.out.println("最终通知执行了...");
       }
       @Around(value = "execution(* com.oracle.DAO.UserDAO.*(..))")
       public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
           System.out.println("环绕通知开始执行...");
           //调用被增强的方法
           proceedingJoinPoint.proceed();
           System.out.println("环绕通知结束执行...");

       }

}
